package simulaco.business;

import gminet.infra.business.BusinessException;
import gminet.infra.business.BusinessObject;
import gminet.infra.db.Transaction;
import gminet.infra.db.TransactionException;
import gminet.infra.toolkit.Cryptography;

import java.sql.Connection;
import java.util.Random;

import simulaco.dao.UsuarioDAO;
import simulaco.dto.Usuario;
import simulaco.dto.UsuarioMaster;
import simulaco.dto.UsuarioSituacao;


/**
 * @author Gabriel Flores Mendes
 * 
 * 
 */
public class LoginBusiness extends BusinessObject {

    protected static final String CRYPT_KEY = "SIMULACO";
    private static final Random RANDOM = new Random();

    public static boolean verifyLogin(Usuario usuario) throws BusinessException, TransactionException {

        return executeLogin(usuario.getEmail(), usuario.getSenhaAcesso()) != null;
    }

    public static Usuario executeLogin(Usuario usuario) throws BusinessException, TransactionException {

        return executeLogin(usuario.getEmail(), usuario.getSenhaAcesso());
    }

    public static Usuario executeLogin(String email, String password) throws BusinessException, TransactionException {

        Usuario usuario = null;
        Transaction transaction = createTransaction();
        try {
            Connection conn = transaction.getConnection();
            Usuario usuarioAux = null;
            if (email.equalsIgnoreCase(UsuarioMaster.getInstance().getEmail())) {
                usuarioAux = UsuarioMaster.getInstance();
                if (!crypt(password).equals(usuarioAux.getSenhaAcesso())) {
                    throw new BusinessException("Senha inválida.");
                }
            } else {
                usuarioAux = UsuarioDAO.findByEmail(email, conn);
                if (usuarioAux == null) {
                    throw new BusinessException("Cliente não encontrado.");
                } else {
                    UsuarioSituacao status = usuarioAux.getSituacao();
                    if (status.equals(UsuarioSituacao.DESABILITADO)) {
                        throw new BusinessException("Cliente inativo. Favor entrar em contato.");
                    }
                    String decSenhaAcesso = password;
                    if (Cryptography.isAutoCrypt(password)) {
                        decSenhaAcesso = Cryptography.autoDecrypt(password);
                    }
                    String senhaAcesso = UsuarioDAO.findSenhaAcesso(usuarioAux.getCodigo(), conn);
                    if (!crypt(decSenhaAcesso).equals(senhaAcesso)) {
                        throw new BusinessException("Senha inválida.");
                    }
                }
            }
            usuario = usuarioAux;
            //
        } finally {
            releaseTransaction(transaction);
        }
        return usuario;
    }

    public static void resetSenhaAcesso(String email) throws BusinessException, TransactionException {

        Transaction transaction = createTransaction();
        try {
            Connection conn = transaction.getConnection();
            Usuario usuarioAux = UsuarioDAO.findByEmail(email, conn);
            if (usuarioAux == null) {
                throw new BusinessException("Cliente não encontrado.");
            }
            // alterarsenha
            String novaSenha = getRandomSenhaAcesso();
            usuarioAux.setSenhaAcesso(crypt(novaSenha));
            UsuarioBusiness.updatePassword(usuarioAux, conn);
            sendMailLogin(usuarioAux, novaSenha);
            //
            transaction.commit();
        } catch (TransactionException te) {
            transaction.rollback();
            throw te;
        } finally {
            releaseTransaction(transaction);
        }
    }

    private static String getRandomSenhaAcesso() {

        byte[] byteArray = new byte[8];
        int i = 0;
        while (i < byteArray.length) {
            byte actualByte = (byte) (RANDOM.nextInt(43) + 48);
            // bytes invalidos
            if (actualByte > 57 && actualByte < 65) {
                continue;
            }
            byteArray[i++] = actualByte;
        }
        return new String(byteArray).toLowerCase();
    }

    protected static String crypt(String senha) {

        return Cryptography.crypt(CRYPT_KEY, senha);
    }

    private static void sendMailLogin(Usuario usuario, String novaSenha) throws BusinessException {

        // String email = usuario.getEmail();
        // String subject = "Senha de acesso SAC online";
        String content = "Senha de acesso: \n\n";
        content += "Nome cliente  : " + usuario.getNome() + "\n";
        content += "Email cliente : " + usuario.getEmail() + "\n";
        content += "Senha cliente : " + novaSenha + "\n";
        content += "\n\n\n\n";
        content += "http://www.gminet.com.br/sac\n";
        content += "\n\n";
        content += "* esse email foi gerado pelo sistema, favor não responder \n";
        // if (!SendMail.sendMail(SendMail.FROM_NOREPLAY, email, subject,
        // content)) {
        // throw new
        // BusinessException("N�o foi poss�vel enviar o email. Contate o suporte.");
        // }
    }

}
